//package com.ruoyix.aicode.service;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.ruoyix.aicode.domain.Message;
//import com.ruoyix.aicode.domain.PageSection;
//import com.ruoyix.aicode.domain.PageStyle;
//import com.ruoyix.aicode.util.CodeGenerationUtil;
//import com.ruoyix.aicode.util.LlmUtil;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import reactor.core.publisher.Flux;
//import reactor.core.publisher.FluxSink;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.stream.Collectors;
//
//public class FrontVueCodeService {
//
//    private static final Logger logger = LoggerFactory.getLogger(FrontCodeService.class);
//    private final ObjectMapper objectMapper = new ObjectMapper();
//
//    // 存储每个阶段的累积内容
//    private final Map<String, StringBuilder> stageContentMap = new ConcurrentHashMap<>();
//
//    // 存储骨架代码
//    private StringBuilder skeletonCode = new StringBuilder();
//
//    // 存储页面结构数组
//    private final List<PageSection> pageSections = new ArrayList<>();
//
//    // 存储已生成的组件代码
//    private final Map<String, String> generatedComponents = new ConcurrentHashMap<>();
//
//    // 事件发送器
//    private FluxSink<String> eventSink;
//
//    // 页面风格设定
//    private PageStyle pageStyle = new PageStyle();
//
//    // 存储全局对话上下文历史
//    private final List<Message> conversationHistory = new ArrayList<>();
//
//    // 全局上下文开关
//    private boolean useGlobalContext = true;
//
//    private Flux<String> generateVueCodeInSteps(String requirements) {
//        logger.info("开始生成Vue代码步骤，需求长度: {}", requirements.length());
//
//        // 使用纯响应式方式处理流
//        return Flux.create(sink -> {
//            this.eventSink = sink;  // 保存全局引用，以便其他方法可以使用
//
//            try {
//                // 步骤0: 风格设定
//                logger.info("开始执行步骤0: 页面风格设定");
//
//                // 发送步骤开始事件
//                String styleStartEvent = "{\"stage\": \"style\", \"status\": \"start\", \"message\": \"开始设定页面风格\"}";
//                logger.info("发送风格设定开始事件: {}", styleStartEvent);
//                sink.next(styleStartEvent);
//
//                // 使用当前的页面风格设置
//                String styleCompleteEvent = createStepCompleteEvent("style_complete", "页面风格设定完成", "style");
//                Map<String, Object> styleJsonObject;
//                try {
//                    styleJsonObject = objectMapper.readValue(styleCompleteEvent, Map.class);
//                    styleJsonObject.put("styleInfo", pageStyle);
//                    String styleJsonStr = objectMapper.writeValueAsString(styleJsonObject);
//                    logger.info("发送风格设定完成事件: {}", styleJsonStr);
//                    sink.next(styleJsonStr);
//                } catch (Exception e) {
//                    logger.error("创建风格完成事件失败: {}", e.getMessage(), e);
//                }
//
//                // 步骤1: 分析需求及页面结构 - 对Vue和HTML可以使用相同的分析
//                logger.info("开始执行步骤1: 分析需求及页面结构");
//
//                // 发送步骤开始事件
//                String analysisStartEvent = "{\"stage\": \"analysis\", \"status\": \"start\", \"message\": \"开始分析需求\"}";
//                logger.info("发送分析开始事件: {}", analysisStartEvent);
//                sink.next(analysisStartEvent);
//
//                // 调用LLM分析需求 - 使用非阻塞方式
//                String prompt = CodeGenerationUtil.buildAnalysisPrompt(requirements);
//                String systemPrompt = "现在你正在执行分析阶段，请作为一个专业的前端开发分析师，分析用户需求并设计页面结构。请使用<!-- SECTION>标签格式返回页面结构。";
//
//                List<Map<String, String>> messages = LlmUtil.prepareMessages(
//                    conversationHistory, useGlobalContext, systemPrompt, prompt);
//
//                LlmUtil.callLLM(messages, chunk -> {
//                        // 将响应保存到阶段内容中
//                        if (!stageContentMap.containsKey("analysis")) {
//                            stageContentMap.put("analysis", new StringBuilder());
//                        }
//                        stageContentMap.get("analysis").append(chunk);
//
//                        // 发送进度事件
//                        try {
//                            String eventData = String.format("{\"stage\": \"%s\", \"status\": \"progress\", \"content\": %s}",
//                                "analysis", objectMapper.writeValueAsString(chunk));
//                            sink.next(eventData);
//                        } catch (Exception e) {
//                            logger.error("发送进度事件出错: {}", e.getMessage(), e);
//                        }
//                    })
//                    .doOnSuccess(v -> {
//                        try {
//                            logger.info("分析需求完成，解析页面结构");
//                            if (stageContentMap.containsKey("analysis")) {
//                                String analysisContent = stageContentMap.get("analysis").toString();
//                                CodeGenerationUtil.parsePageStructure(analysisContent, pageSections);
//
//                                // 保存助手响应到历史
//                                if (useGlobalContext) {
//                                    conversationHistory.add(new Message("assistant", analysisContent));
//                                }
//                            } else {
//                                logger.error("未找到analysis阶段的内容");
//                            }
//
//                            List<String> ids = pageSections.stream()
//                                .map(PageSection::getId)
//                                .collect(Collectors.toList());
//
//                            // 发送步骤完成事件
//                            String analysisCompleteEvent = createStepCompleteEvent("analysis_complete", "需求分析完成", "analysis");
//                            Map<String, Object> analysisJsonObject = objectMapper.readValue(analysisCompleteEvent, Map.class);
//                            analysisJsonObject.put("steps", ids);
//                            String analysisJsonStr = objectMapper.writeValueAsString(analysisJsonObject);
//                            logger.info("发送分析完成事件: {}", analysisJsonStr);
//                            sink.next(analysisJsonStr);
//
//                            // 步骤2: 生成Vue页面骨架
//                            startVueSkeletonGeneration(requirements, sink);
//                        } catch (Exception e) {
//                            logger.error("处理分析结果时出错: {}", e.getMessage(), e);
//                            sink.error(e);
//                        }
//                    })
//                    .subscribe(
//                        null,
//                        error -> {
//                            logger.error("分析需求过程中出错: {}", error.getMessage(), error);
//                            sink.error(error);
//                        }
//                    );
//            } catch (Exception e) {
//                logger.error("启动生成流程时出错: {}", e.getMessage(), e);
//                sink.error(e);
//            }
//        });
//    }
//}
